package com.oreilly.rdf.tenuki.jaxrs; import java.util.Iterator; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import com.hp.hpl.jena.rdf.model.Model; import com.oreilly.rdf.tenuki.Changeset; import com.oreilly.rdf.tenuki.ChangesetHandler; @Path("/graphs/") public class GraphResource extends DatasetAccessResource { @Produces("text/uri-list") @GET public String getGraphsAsURIList() { StringBuilder urilist = new StringBuilder(); for (Iterator<String> iterator = getDataset().listNames(); iterator .hasNext();) { String name = iterator.next(); urilist.append(name); urilist.append("\r\n"); } return urilist.toString(); } @Produces({"application/rdf+xml", "text/turtle", "text/rdf+n3", "text/plain"}) @GET public Model getGraphByQueryParam(@QueryParam("graph") String graphUri) { return getDataset().getNamedModel(graphUri); } @Path("{graphUri}") @Produces({"application/rdf+xml", "text/turtle", "text/rdf+n3", "text/plain"}) @GET public Model getGraph(@PathParam("graphUri") String graphUri) { return getDataset().getNamedModel(graphUri); } @Path("{graphUri}") @Consumes({"application/rdf+xml", "text/turtle", "text/rdf+n3", "text/plain"}) @POST public Response updateGraph(@PathParam("graphUri") String graphUri, Model model) { Model dsModel = getDataset().getNamedModel(graphUri); try { if (dsModel.supportsTransactions()) { dsModel.begin(); } dsModel.add(model); dsModel.close(); if (dsModel.supportsTransactions()) { dsModel.commit(); } } catch (RuntimeException e) { if (dsModel.supportsTransactions()) { dsModel.abort(); } } return Response.noContent().build(); } @Path("{graphUri}") @Consumes({"application/rdf+xml", "text/turtle", "text/rdf+n3", "text/plain"}) @PUT public Response setGraph(@PathParam("graphUri") String graphUri, Model model) { Model dsModel = getDataset().getNamedModel(graphUri); try { if (dsModel.supportsTransactions()) { dsModel.begin(); } dsModel.removeAll(); dsModel.add(model); dsModel.close(); if (dsModel.supportsTransactions()) { dsModel.commit(); } } catch (RuntimeException e) { if (dsModel.supportsTransactions()) { dsModel.abort(); } } return Response.noContent().build(); } @Path("{graphUri}") @DELETE public Response deleteGraph(@PathParam("graphUri") String graphUri) { Model dsModel = getDataset().getNamedModel(graphUri); try { if (dsModel.supportsTransactions()) { dsModel.begin(); } dsModel.removeAll(); dsModel.close(); if (dsModel.supportsTransactions()) { dsModel.commit(); } } catch (RuntimeException e) { if (dsModel.supportsTransactions()) { dsModel.abort(); } } return Response.noContent().build(); } @Path("{graphUri}") @Consumes("application/vnd.talis.changeset+xml") @PATCH public Response applyChangesetToGraph( @PathParam("graphUri") String graphUri, Changeset changeset) { return applyChangeset(graphUri, changeset); } private Response applyChangeset(String graphUri, Changeset changeset) { String subject = changeset.getSubjectOfChange().toString(); if ("changes".equals(graphUri) || subject.equals(graphUri)) { Model dsModel = getDataset().getNamedModel(graphUri); ChangesetHandler handler = new ChangesetHandler(dsModel); handler.applyChangeset(changeset); return Response.noContent().build(); } else { return Response.serverError().build(); } } }